package com.ww.util.guava;

import com.google.common.base.Function;
import com.google.common.collect.Ordering;

public class OrderingDemo1 {
    /**
     * 强大的Ordering排序器
     * natural()
     * 对可排序类型做自然排序，如数字按大小，日期按先后顺序
     *
     * usingToString()
     * 按对象的字符串形式做字典排序
     *
     * from(Comparator)
     * 把给定的Comparator转化为排序器
     *
     * reverse()
     * 获取语义相反的排序器
     *
     * nullsFirst()
     * 使用当前排序器，但额外把null排到最前面
     *
     * nullsLast()
     * 使用当前排序器，但额外把null值排到最后面
     *
     * compound(Comparator)
     * 合成另一个比较器，以处理当前排序器中的相等情况
     *
     * lexicographical()
     * 基于处理类型T的排序器，返回该类型的可迭代对象Iterable<T>的排序器
     *
     * onResultOf(Function)
     * 对集合中元素调用Function，再按返回值用当前排序器排序
     */
    public static void main(String[] args) {
        Person person = new Person("aa", 14);
        Person ps = new Person("bb", 13);

        Ordering<Person> ordering = Ordering.natural().nullsFirst().onResultOf(new Function<Person, String>() {
            @Override
            public String apply(Person input) {
                return input.getAge().toString();
            }
        });

        ordering.compare(person, ps);
        /**
         * 打印结果：1
         * person的年龄比ps大，所以输出1
         */
        System.out.println(ordering.compare(person, ps));
    }
}

class Person {

    public Person() {}

    public Person(String name, Integer age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    private String name;

    private Integer age;
}